﻿#ifndef WRWAVEPLAYROUTINE_H
#define WRWAVEPLAYROUTINE_H

#include <QEvent>
#include <QIODevice>
#include <QAtomicInt>
#include <QAudioOutput>
#include "WRWavePlayer.h"
#include "WRWavePlayBuffer.h"

//表示波形播放例程。
class WRWavePlayRoutine : public QObject
{
    Q_OBJECT

private:
    //引用计数。
    QAtomicInt m_refCnt;
    //输出对象。
    QAudioOutput* m_output;
    //读取对象。
    QIODevice* m_stream;
    //数据流。
    WRWavePlayBuffer* m_buffer;
    //音量值。
    float m_volume;
    //声道通道。
    WRWavePlayer::Channel m_channel;

    //释放当前对象所占用的相关资源。
    ~WRWavePlayRoutine();

public:
    //初始化播放例程。
    WRWavePlayRoutine();

    //执行消息处理。
    bool event(QEvent * e);

    //获取音量。
    inline float volume(void) const
    {
        return m_volume;
    }
    //设置音量，音量范围0~1。
    void volume(float value);

    //获取声道。
    inline WRWavePlayer::Channel channel(void) const
    {
        return m_channel;
    }
    //设置声道。
    void channel(WRWavePlayer::Channel value);

    //初始化播放器并开始播放。
    void start(int sampleRate);
    //停止播放。
    void stop(void);

    //写入要播放的数据。
    inline void write(const short* data, int size)
    {
        m_buffer->writeData(data, size);
    }

    //获取当前是否正在播放。
    inline bool status(void) const
    {
        return m_buffer != 0;
    }

    //获取当前处理的采样速率。
    inline int sampleRate(void) const
    {
        return m_buffer->sampleRate();
    }

    //添加引用。
    inline void addRef(void)
    {
        m_refCnt.ref();
    }
    //释放引用计数，如果引用计数为0，则释放当前对象所占用的相关资源，并返回True。
    inline bool release(void)
    {
        if (!m_refCnt.deref())
        {
            stop();
            deleteLater();
            return true;
        }
        return false;
    }
};

#endif // WRWAVEPLAYROUTINE_H
